import {LogCategory, logger} from '../../logger';
import {BaseStoreService} from './BaseStoreService';
import {HistorySchema} from '../types';

/**
 * 历史记录存储服务类
 * 负责管理浏览历史记录
 */
export class HistoryService extends BaseStoreService<HistorySchema> {
  private static instance: HistoryService;

  /**
   * 私有构造函数
   */
  private constructor() {
    super('History', {history: []});
  }

  /**
   * 获取HistoryService单例实例
   */
  public static getInstance(): HistoryService {
    if (!HistoryService.instance) {
      HistoryService.instance = new HistoryService();
    }
    return HistoryService.instance;
  }

  /**
   * 获取历史记录
   */
  public getHistory(): HistorySchema['history'] {
    logger.debug(this.moduleName, LogCategory.SYSTEM, '获取历史记录');
    return this.store.get('history');
  }

  /**
   * 添加历史记录条目
   * @param entry 历史记录数据
   */
  public addHistoryEntry(entry: Omit<HistorySchema['history'][0], 'id' | 'visitCount' | 'lastVisitTime'>): void {
    const history = this.getHistory();
    const existingEntry = history.find(item => item.url === entry.url);

    if (existingEntry) {
      // 更新已存在的条目
      logger.debug(this.moduleName, LogCategory.SYSTEM, `更新历史记录条目: ${entry.title}, URL: ${entry.url}`);

      const updatedHistory = history.map(item => {
        if (item.url === entry.url) {
          return {
            ...item,
            title: entry.title || item.title,
            visitCount: item.visitCount + 1,
            lastVisitTime: Date.now()
          };
        }
        return item;
      });

      this.store.set('history', updatedHistory);
      return;
    }

    // 添加新条目
    logger.debug(this.moduleName, LogCategory.SYSTEM, `添加新历史记录: ${entry.title}, URL: ${entry.url}`);

    const newEntry = {
      ...entry,
      id: Date.now().toString(),
      visitCount: 1,
      lastVisitTime: Date.now()
    };

    this.store.set('history', [...history, newEntry]);
  }

  /**
   * 清除指定时间段的历史记录
   * @param startTime 开始时间戳
   * @param endTime 结束时间戳
   */
  public clearHistory(startTime?: number, endTime?: number): void {
    try {
      if (startTime && endTime) {
        // 清除指定时间段的历史记录
        logger.info(this.moduleName, LogCategory.SYSTEM, `清除时间段历史记录: ${new Date(startTime).toISOString()} - ${new Date(endTime).toISOString()}`);
        const history = this.getHistory();
        const filteredHistory = history.filter(item =>
          item.lastVisitTime < startTime || item.lastVisitTime > endTime
        );
        this.store.set('history', filteredHistory);
      } else {
        // 清除所有历史记录
        logger.info(this.moduleName, LogCategory.SYSTEM, '清除所有历史记录');
        this.store.set('history', []);
      }
    } catch (error) {
      logger.error(this.moduleName, LogCategory.SYSTEM, '清除历史记录失败', error);
    }
  }

  /**
   * 清理存储数据
   */
  public cleanupStore(): void {
    try {
      // 仅在需要时清理历史记录
      logger.info(this.moduleName, LogCategory.SYSTEM, '历史记录存储清理');
      // 可以设置一个保留期限，如保留最近30天的历史记录
      const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000;
      const history = this.getHistory();
      const recentHistory = history.filter(item => item.lastVisitTime > thirtyDaysAgo);

      if (recentHistory.length < history.length) {
        logger.info(this.moduleName, LogCategory.SYSTEM, `清理${history.length - recentHistory.length}条旧历史记录`);
        this.store.set('history', recentHistory);
      }
    } catch (error) {
      logger.error(this.moduleName, LogCategory.SYSTEM, '历史记录存储清理失败', error);
    }
  }
}
